# Author   : zhen.fang
# Time     : 2020/10/11 21:13
# Email    : fangeddie@163.com


def get_logging(PROJECT_NAME, BASE_LOG_DIR):
    return {
        'version': 1,  # 保留字
        'disable_existing_loggers': False,  # 禁用已经存在的logger实例
        # 日志文件的格式
        'formatters': {
            # 详细的日志格式%name就是getLogger中传递的名字
            'standard': {
                'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'
                          '[%(levelname)s][%(message)s]'
            },
            # 简单的日志格式
            'simple': {
                'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
            },
            # 定义一个特殊的日志格式
            'collect': {
                'format': '%(message)s'
            }
        },
        # 过滤器
        'filters': {
            'require_debug_true': {
                '()': 'django.utils.log.RequireDebugTrue',
            },
        },
        # 处理器
        'handlers': {
            # 在终端打印
            'console': {
                'level': 'DEBUG',
                'filters': ['require_debug_true'],  # 只有在Django debug为True时才在屏幕打印日志
                'class': 'logging.StreamHandler',  #
                'formatter': 'simple'
            },
            # 默认的
            'default': {
                'level': 'INFO',
                'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件，自动切
                'filename': BASE_LOG_DIR / f"{PROJECT_NAME}_info.log",  # 日志文件
                'maxBytes': 1024 * 1024 * 50,  # 日志大小 50M
                'backupCount': 2,  # 最多备份几个
                'formatter': 'simple',
                'encoding': 'utf-8',
            },
            # 专门用来记错误日志
            'error': {
                'level': 'ERROR',
                'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件，自动切
                'filename': BASE_LOG_DIR / f"{PROJECT_NAME}_err.log",  # 日志文件
                'maxBytes': 1024 * 1024 * 50,  # 日志大小 50M
                'backupCount': 5,
                'formatter': 'standard',
                'encoding': 'utf-8',
            },
            # 专门定义一个收集特定信息的日志
            # 'something_collect': {
            #     'level': 'INFO',
            #     'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件，自动切
            #     'filename': BASE_LOG_DIR / f"{PROJECT_NAME}_collect.log",
            #     'maxBytes': 1024 * 1024 * 50,  # 日志大小 50M
            #     'backupCount': 5,
            #     'formatter': 'collect',
            #     'encoding': "utf-8"
            # }
        },
        'loggers': {
            # 默认的logger应用如下配置
            # 使用 '' 项目中可以直接用 __name__
            # '': {
            #     'handlers': ['default', 'console', 'error'],  # 非开发环境移除 'console'
            #     'level': 'DEBUG',
            #     'propagate': True,  # 向不向更高级别的logger传递
            # },
            # 特殊处理某一 logger
            # 'something_collect': {
            #     'handlers': ['console', 'something_collect'],
            #     'level': 'INFO',
            # },

        },
    }

# 附录1：log等级
# DEBUG:通常是生产环境调试消息
# INFO:一般的系统消息
# WARNING:发生了小问题
# ERROR:发生了重要问题
# CRITICAL:发生了严重问题
# NOTSET（0）、DEBUG（10）、INFO（20）、WARNING（30）、ERROR（40）、CRITICAL（50）
# 输出>=的消息
# Logger 用户使用的直接接口，将日志传递给Handler
# Filter 控制哪些日志可以从logger流向Handler
# Handler 控制日志输出到哪里，console，file… 一个logger可以有多个Handler
# Formatter 控制日志的格式

# 附录2：日志格式
# %(levelno)s: 打印日志级别的数值
# %(levelname)s: 打印日志级别名称
# %(pathname)s: 打印当前执行程序的路径，其实就是sys.argv[0]
# %(filename)s: 打印当前执行程序名
# %(funcName)s: 打印日志的当前函数
# %(lineno)d: 打印日志的当前行号
# %(asctime)s: 打印日志的时间
# %(thread)d: 打印线程ID
# %(threadName)s: 打印线程名称
# %(process)d: 打印进程ID
# %(message)s: 打印日志信息
# ======== logging ========
